今天鐵人25天要來繪製K線圖,在繪製K線圖之前要先安裝Ta-lib
。
Ta-lib:python套件,專門用來計算金融技術指標。裡面有很多好用的function,今天用來算出均線。
K線圖:根據股價一天走勢的 4 個價位:開盤價、收盤價、最高價、最低價繪製而成。開盤價與收盤價,會構成 K 線的實體(Body),最高價、最低價分別成為上影線(Shadow)及下影線。如果收盤價高於開盤價,Body 為紅色;收盤價低於開盤價,Body 為黑色或是綠色。
下載
安裝的網址Url到此網頁後尋找
其中cp36表示python3.6,win32表示32位,amd64表示64位,請自行下載對應的檔案
從Anaconda Prompt安裝,cd 到下載的資料夾,執行以下指令,請將 「TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl」換成自己下載的檔案名稱
pip install TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl
# basic
import numpy as np
import pandas as pd
# get data
import pandas_datareader as pdr
# visual
import matplotlib.pyplot as plt
import mpl_finance as mpf
%matplotlib inline
import seaborn as sns
#time
import datetime as datetime
#talib
import talib
使用pandas_datareader抓取某個股票,這邊使用台積電(2330)
start = datetime.datetime(2018,4,1)
df_2330 = pdr.DataReader('2330.TW', 'yahoo', start=start)
使用set_xticklabels來繪製蠟燭
df_2330.index = df_2330.index.format(formatter=lambda x: x.strftime('%Y-%m-%d'))
fig = plt.figure(figsize=(24, 8))
ax = fig.add_subplot(1, 1, 1)
ax.set_xticks(range(0, len(df_2330.index), 10))
ax.set_xticklabels(df_2330.index[::10])
mpf.candlestick2_ochl(ax, df_2330['Open'], df_2330['Close'], df_2330['High'],
df_2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75);
從上圖可以看到很基本的k線圖,接下來要加上10日均線和30日均線
加上10日均線和30日均線
sma_10 = talib.SMA(np.array(df_2330['Close']), 10)
sma_30 = talib.SMA(np.array(df_2330['Close']), 30)
fig = plt.figure(figsize=(24, 8))
ax = fig.add_subplot(1, 1, 1)
ax.set_xticks(range(0, len(df_2330.index), 10))
ax.set_xticklabels(df_2330.index[::10])
mpf.candlestick2_ochl(ax, df_2330['Open'], df_2330['Close'], df_2330['High'],
df_2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75)
plt.rcParams['font.sans-serif']=['Microsoft JhengHei']
ax.plot(sma_10, label='10日均線')
ax.plot(sma_30, label='30日均線')
ax.legend();
sma_10 = talib.SMA(np.array(df_2330['Close']), 10)
sma_30 = talib.SMA(np.array(df_2330['Close']), 30)
fig = plt.figure(figsize=(24, 15))
ax = fig.add_axes([0,0.2,1,0.5])
ax2 = fig.add_axes([0,0,1,0.2])
ax.set_xticks(range(0, len(df_2330.index), 10))
ax.set_xticklabels(df_2330.index[::10])
mpf.candlestick2_ochl(ax, df_2330['Open'], df_2330['Close'], df_2330['High'],
df_2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75)
plt.rcParams['font.sans-serif']=['Microsoft JhengHei']
ax.plot(sma_10, label='10日均線')
ax.plot(sma_30, label='30日均線')
mpf.volume_overlay(ax2, df_2330['Open'], df_2330['Close'], df_2330['Volume'], colorup='r', colordown='g', width=0.5, alpha=0.8)
ax2.set_xticks(range(0, len(df_2330.index), 10))
ax2.set_xticklabels(df_2330.index[::10])
ax.legend();
接下來要來加上KD指標
公式:
未成熟隨機值(RSV):(今日收盤價 - 最近9天的最低價) / (最近9天最高價 - 最近9天的最低價)
當日K值:前日K值 * (2/3) + 當日RSV值 * (1/3)
當日D值:前日D值 * (2/3) + 當日K值 * (1/3)
K值就是日常的波動,D值就是稍大一點的趨勢,而RSV就是K的次一級的級數了。三者的關係就像是浪花(RSV),和波浪(K,D)的關係。
KD指標之所以被廣為運用,在於它涵蓋了一定時間內最高價與最低價的概念,因此可以很靈敏地反映出價格的變化。
KD黃金交叉:當KD指標的K值由下往上突破D值,建議買進、做多。
KD死亡交叉:當KD指標的K值由上往下跌破D值時,建議賣出、做空。
KD鈍化:K值在高檔 (K > 80) 或低檔( K < 20) 區連續3天,因為當一檔股票高檔鈍化(K值>80,3天以上),表示非常的強勢通常會再漲的機會就會變得非常高。
sma_10 = talib.SMA(np.array(df_2330['Close']), 10)
sma_30 = talib.SMA(np.array(df_2330['Close']), 30)
df_2330['k'], df_2330['d'] = talib.STOCH(df_2330['High'], df_2330['Low'], df_2330['Close'])
df_2330['k'].fillna(value=0, inplace=True)
df_2330['d'].fillna(value=0, inplace=True)
fig = plt.figure(figsize=(24, 20))
ax = fig.add_axes([0,0.3,1,0.4])
ax2 = fig.add_axes([0,0.2,1,0.1])
ax3 = fig.add_axes([0,0,1,0.2])
ax.set_xticks(range(0, len(df_2330.index), 10))
ax.set_xticklabels(df_2330.index[::10])
mpf.candlestick2_ochl(ax, df_2330['Open'], df_2330['Close'], df_2330['High'],
df_2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75)
plt.rcParams['font.sans-serif']=['Microsoft JhengHei']
ax.plot(sma_10, label='10日均線')
ax.plot(sma_30, label='30日均線')
ax2.plot(df_2330['k'], label='K值')
ax2.plot(df_2330['d'], label='D值')
ax2.set_xticks(range(0, len(df_2330.index), 10))
ax2.set_xticklabels(df_2330.index[::10])
mpf.volume_overlay(ax3, df_2330['Open'], df_2330['Close'], df_2330['Volume'], colorup='r', colordown='g', width=0.5, alpha=0.8)
ax3.set_xticks(range(0, len(df_2330.index), 10))
ax3.set_xticklabels(df_2330.index[::10])
ax.legend();
ax2.legend();
KD值的前8天會是Nan,為了讓時間序列相同,因此將Nan值填入0,所以前8天的KD值不具任何參考作用。
以上就完成基礎的k線圖了。可喜可賀。
股市走勢可以使用KD值做參考,當遇到KD黃金交叉時買入,KD死亡交叉賣出。
https://www.cmoney.tw/notes/note-detail.aspx?nid=6460
summer大大您好,
我有安裝anaconda3,且使用jupyter notebook執行,並已安裝Ta-lib,我在複製程式碼到繪製蠟燭這片段時,執行會出現AttributeError: module 'mpl_finance' has no attribute 'candlestick2_ochl'
我google網路上,都是使用這類型語法
mpf.candlestick2_ochl....
但搜不到解決辦法,請問大大知道原因嗎?
先謝謝summer大,我在另一台電腦用沒有這個問題,有問題的那台電腦我還沒試著去排除,有時間時再去試試看,感恩!
我在安裝時TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl會有以下的錯誤出現,
請問如何解決?
Nice post.
由於mpl_finance已不支援,所以將下面的程式碼
import mplfinance as mpf
df2330.index = df2330.index.format(formatter=lambda x: x.strftime('%Y-%m-%d'))
fig = plt.figure(figsize=(24, 8))
ax = fig.addsubplot(1, 1, 1)
ax.setxticks(range(0, len(df2330.index), 10))
ax.setxticklabels(df2330.index[::10])
mpf.candlestick2ochl(ax, df2330['Open'], df2330['Close'], df2330['High'],
df2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75);
改成這樣才能使用,不過一來畫面沒原po的好看,二來後面的例子就沒辦法照個實作了
import mplfinance as mpf
df_2330.index.name = 'Date'
mpf.plot(df_2330,type='candle', mav=(5,10,20),volume=True)